e.Toscana Compliance 
Request for Comments: 
Del: 25/02/2007 
Categoria: Applicativa
Destinatari: Regione Toscana, ASL/AO

Flusso SPA ad eventi 
	
Indice
======
1. Contesto di riferimento	
2. Obiettivi	
3. Analisi 
4. Prodotti attesi
5. Bibliografia

1. Contesto di riferimento
==========================

Il validatore flussi e' composto da due componenti:
1)	il Web Service di ricezione del record SPA
2)	il servizio di validazione del record SPA

Il Web Service svolge il ruolo di interfaccia di comunicazione tra i sistemi informativi delle ASL/AO e il Proxy Validatore dei flussi DOC. In particolare, dal punto di vista dell'architettura del Proxy Applicativo, il Web Service e' un Adapter. 

Il servizio di validazione consiste nel eseguire per un singolo record le tre fasi della validazione esistenti per tutti i flussi DOC: 
inizio validazione per la creazione della testata, validazione del singolo record con calcolo delle compensazioni e chiusura della validazione con cambio di stato alla testata.


2. Obiettivi
============

L'obiettivo principale e' quello di permettere l'invio delle ricette, relativamente alle prestazioni specialistiche, ad eventi eliminando la necessit di invio massivo a flussi.
I vantaggi che questo meccanismo permette di raggiungere sono :
a. Invio in tempo reale delle prestazioni
b. Riduzione dell'intervento umano


3. Analisi
==========

L'applicazione Validatore flusso SPA ad eventi permette alle ASL/AO di inviare al NAL un solo record di specialistica ambulatoriale e di ricevere in tempo reale lesito della validazione.

Lapplicazione implementa le regole di validazione specificate da Regione Toscana nel documento Manuale flussi DOC, che consistono nel valorizzare opportuni flag di errore per ciascun campo di input.

Le funzionalit principali offerte dallapplicazione sono:
1)	validazione del record SPA senza salvataggio sul DB di transito (modalit di test)
2)	validazione del record SPA con salvataggio sul DB di transito 

L'applicazione Validatore Flusso SPA ad eventi non presenta una interfaccia utente, essendo un componente pilotato direttamente tramite la chiamata di un web service attivabile da una richiesta http ed invocato direttamente dai sistemi informativi delle ASL/AO. 

L'applicazione Validatore record SPA ad eventi viene alimentata con un documento XML inviato in input e contenente la prestazione SPA che deve essere trasmessa al Sistema Informativo Socio-Sanitario di Regione Toscana. 

Per ogni validazione la ASL/AO deve comunicare:
1)	La modalit di validazione (validazione con trasmissione della prestazione al Sistema Informativo Socio-Sanitario di Regione Toscana, oppure validazione di test senza trasmissione)
2)	Lanno di riferimento del flusso
3)	Tutte le informazione che compongono il record SPA, definite nel documento Manuali dei Flussi DOC

I processi elaborativi implementati dall'applicazione Validatore record SPA ad eventi consistono di:
1) ricezione di una chiamata al web service
2) verifica che il documento XML sia valido, basandosi su uno schema XSD
3) attivazione del servizio specifico del Proxy Applicativo
4) validazione
5) salvataggio sul DB di transito se la modalita' scelta dall'utente non e' una modalita' di test
6) risposta all'utente con un documento XML valido secondo lo schema XML definito nel documento del Manuale Utente 

Gli schema XML che definiscono il formato dei messaggi scambiati dal client con i servizi esposti dal web-service, 
ovvero i documenti XML contenenti il record SPA da validare e il record SPA validato, sono riportati di seguito.

L'attributo test del tag PrestazioniAmbulatorialiRichiesta serve per discriminare 
la modalita' di test (validazione del record senza salvataggio nel DB di transito) 
dalla modalita' di validazione con salvataggio nel DB di transito.

-------------------------------------
* XSD SPARealTimeValidatorToken.xsd *
-------------------------------------

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">

	<xs:element name="PrestazioniAmbulatorialiRichiesta">
		<xs:annotation>
			<xs:documentation>Record da validare</xs:documentation>
		</xs:annotation>
		
		<xs:complexType>
			<xs:sequence>
				<xs:element name="PrestazioniAmbulatoriali1" type="PrestazioniAmbulatoriali1Richiesta"/>
				<xs:element name="PrestazioniAmbulatoriali2" type="PrestazioniAmbulatoriali2Richiesta" minOccurs="1" maxOccurs="unbounded"/>
			</xs:sequence>
			
                        <xs:attribute name="test" type="xs:boolean" use="optional" default="false"/>
			<xs:attribute name="annoRiferimento" type="xs:int" use="required"/>
		</xs:complexType>
	</xs:element>

        <xs:element name="PrestazioniAmbulatorialiRisposta">
		<xs:annotation>
			<xs:documentation>Record validato</xs:documentation>
		</xs:annotation>
		
		<xs:complexType>
			<xs:sequence>
				<xs:element name="PrestazioniAmbulatoriali1" type="PrestazioniAmbulatoriali1Risposta"/>
				<xs:element name="PrestazioniAmbulatoriali2" type="PrestazioniAmbulatoriali2Risposta" minOccurs="1" maxOccurs="unbounded"/>
			</xs:sequence>
			
                        <xs:attribute name="test" type="xs:boolean" use="optional" default="false"/>
			<xs:attribute name="annoRiferimento" type="xs:int" use="required"/>
		</xs:complexType>
	</xs:element>
        
	<xs:complexType name="PrestazioniAmbulatoriali1Richiesta">
		<xs:annotation>
			<xs:documentation>Intero record SPA1 da validare</xs:documentation>
		</xs:annotation>
		
		<xs:sequence>
			<xs:element name="Body" type="BodySPA1Type"/>
		</xs:sequence>
	</xs:complexType>

	<xs:complexType name="PrestazioniAmbulatoriali2Richiesta">
		<xs:annotation>
			<xs:documentation>Intero record SPA2 da validare</xs:documentation>
		</xs:annotation>
		
		<xs:sequence>
			<xs:element name="Body" type="BodySPA2Type"/>
		</xs:sequence>
	</xs:complexType>
        
        <xs:complexType name="PrestazioniAmbulatoriali1Risposta">
		<xs:annotation>
			<xs:documentation>Intero record SPA1 validato</xs:documentation>
		</xs:annotation>
		
		<xs:sequence>
			<xs:element name="Meta" type="MetaType"/>
			<xs:element name="Body" type="BodySPA1Type"/>
		</xs:sequence>
	</xs:complexType>

	<xs:complexType name="PrestazioniAmbulatoriali2Risposta">
		<xs:annotation>
			<xs:documentation>Intero record SPA2 validato</xs:documentation>
		</xs:annotation>
		
		<xs:sequence>
			<xs:element name="Meta" type="MetaType"/>
			<xs:element name="Body" type="BodySPA2Type"/>
		</xs:sequence>
	</xs:complexType>
	
	<xs:complexType name="BodySPA1Type">
		<xs:annotation>
			<xs:documentation>Campi specifici SPA1</xs:documentation>
		</xs:annotation>
		
		<xs:sequence>
			<xs:element name="TipoRecord" type="xs:string"/>
			<xs:element name="TipoOp" type="xs:string"/>
			<xs:element name="Chiave" type="xs:string"/>
			<xs:element name="TipoCodUtente" type="xs:string"/>
			<xs:element name="CodUtente" type="xs:string"/>
			<xs:element name="Sesso" type="xs:string"/>
			<xs:element name="DataNascita" type="xs:string"/>
			<xs:element name="Cittadinanza" type="xs:string"/>
			<xs:element name="RgnResidenza" type="xs:string"/>
			<xs:element name="PrvResidenza" type="xs:string"/>
			<xs:element name="CmnResidenza" type="xs:string"/>
			<xs:element name="ASLResidenza" type="xs:string"/>
			<xs:element name="ZonaSanResidenza" type="xs:string"/>
			<xs:element name="RgnIscrSan" type="xs:string"/>
			<xs:element name="ASLIscrSan" type="xs:string"/>
			<xs:element name="ModAccesso" type="xs:string"/>
			<xs:element name="FinalitaPrest" type="xs:string"/>
			<xs:element name="CodRicetta" type="xs:string"/>
			<xs:element name="CFMedicoProponente" type="xs:string"/>
			<xs:element name="RgnMedicoProponente" type="xs:string"/>
			<xs:element name="ASLMedicoProponente" type="xs:string"/>
			<xs:element name="ZonaSanMedicoProponente" type="xs:string"/>
			<xs:element name="TipoMedicoProponente" type="xs:string"/>
			<xs:element name="RgnASLErogatrice" type="xs:string"/>
			<xs:element name="CodASLErogatrice" type="xs:string"/>
			<xs:element name="NrPrest" type="xs:string"/>
			<xs:element name="ImpNettoPrest" type="xs:string"/>
			<xs:element name="ImpTicket" type="xs:string"/>
			<xs:element name="QuoRic" type="xs:string" />
			<xs:element name="QuotAcPS" type="xs:string" />
			<xs:element name="DataPres" type="xs:string" />
			<xs:element name="DataSped" type="xs:string" />
			<xs:element name="VeriCf" type="xs:string" />
			<xs:element name="IstiCompEurop" type="xs:string" />
			<xs:element name="CodIdeUteEurop" type="xs:string" />
			<xs:element name="CodIdeDocuEurop" type="xs:string" />
			<xs:element name="CodStatDocuEurop" type="xs:string" />
			<xs:element name="BiffaStmpElet" type="xs:string" />
			<xs:element name="AltrVerStmpElet" type="xs:string" />
			<xs:element name="TriagePs" type="xs:string" />
			<xs:element name="PatolPs" type="xs:string" />
			<xs:element name="MotAcutPs" type="xs:string" />
			<xs:element name="RicSug" type="xs:string" />
			<xs:element name="TipoAssist" type="xs:string" />
			<xs:element name="NumPrestEff" type="xs:string" />
		</xs:sequence>
	</xs:complexType>
	
	<xs:complexType name="BodySPA2Type">
		<xs:annotation>
			<xs:documentation>Campi specifici SPA2</xs:documentation>
		</xs:annotation>
		
		<xs:sequence>
			<xs:element name="TipoRecord" type="xs:string"/>
			<xs:element name="Chiave" type="xs:string"/>
			<xs:element name="TipoPresidio" type="xs:string"/>
			<xs:element name="PrvPresidio" type="xs:string"/>
			<xs:element name="ComPresidio" type="xs:string"/>
			<xs:element name="CodPresidio" type="xs:string"/>
			<xs:element name="CodSpecialitaPrest" type="xs:string"/>
			<xs:element name="CodRepartoPrest" type="xs:string"/>
			<xs:element name="cod_dis_qua" type="xs:string"/>
			<xs:element name="cod_tip_con" type="xs:string"/>
			<xs:element name="DataPrimoContattoPrest" type="xs:string"/>
			<xs:element name="cod_cup" type="xs:string"/>
			<xs:element name="UrgenzaPrest" type="xs:string"/>
			<xs:element name="DataInizio" type="xs:string"/>
			<xs:element name="DataFine" type="xs:string"/>
			<xs:element name="CodPatologia" type="xs:string"/>
			<xs:element name="cod_icd_9_pre" type="xs:string"/>
			<xs:element name="TipoPrest" type="xs:string"/>
			<xs:element name="CodPrest" type="xs:string"/>
			<xs:element name="CodBrancaPrest" type="xs:string"/>
			<xs:element name="NraccessiPrest" type="xs:string"/>
			<xs:element name="NrPrestErogate" type="xs:string"/>
			<xs:element name="Tariffa" type="xs:string"/>
			<xs:element name="ImpLordo" type="xs:string"/>
			<xs:element name="CostoProdottiSomministrati" type="xs:string"/>
			<xs:element name="Ticket" type="xs:string"/>
			<xs:element name="EsenzioneTicket" type="xs:string"/>
			<xs:element name="cod_ese" type="xs:string"/>
			<xs:element name="OnerePrest" type="xs:string"/>
			<xs:element name="FormaPrest" type="xs:string"/>
			<xs:element name="CFMedicoPrescrittore" type="xs:string"/>
			<xs:element name="TipoMedicoPrescrittore" type="xs:string"/>
			<xs:element name="RegimePrest" type="xs:string"/>
			<xs:element name="TipoMedicoRegime" type="xs:string"/>
			<xs:element name="PrestSoggettaConvenzione" type="xs:string"/>
			<xs:element name="Compensazioni" type="xs:string"/>
		</xs:sequence>
	</xs:complexType>

	<xs:complexType name="HeaderType">
		<xs:annotation>
			<xs:documentation>Meta informazioni</xs:documentation>
		</xs:annotation>
		
		<xs:sequence>
			<xs:element name="Contatore" type="xs:string"/>
                        <xs:element name="ID" type="xs:string"/> 
			<xs:element name="IDHdr" type="xs:string"/>
		</xs:sequence>
	</xs:complexType>
	
	<xs:complexType name="FooterType">
		<xs:annotation>
			<xs:documentation>Meta informazioni</xs:documentation>
		</xs:annotation>
		
		<xs:sequence>
			<xs:element name="AnnoRiferimento" type="xs:string"/>
                        <xs:element name="NrErr" type="xs:string"/>
			<xs:element name="NrWrn" type="xs:string"/>
			<xs:element name="CodASLResidenza" type="xs:string"/>
			<xs:element name="CodRgnResidenza" type="xs:string"/>
			<xs:element name="CodASLInv" type="xs:string"/>
			<xs:element name="FlagErr" type="xs:string"/>
			<xs:element name="FlagErrTot" type="xs:string"/>
                        <xs:element name="CodStaRec" type="xs:string"/>
		</xs:sequence>
	</xs:complexType>

	<xs:complexType name="MetaType">
		<xs:annotation>
			<xs:documentation>Meta informazioni</xs:documentation>
		</xs:annotation>
		
		<xs:sequence>
			<xs:element name="Header" type="HeaderType"/>
			<xs:element name="Footer" type="FooterType"/>
		</xs:sequence>
	</xs:complexType>
			
</xs:schema>





4. Prodotti attesi
==================

Per realizzare l'applicazione client, 
il Validatore Flusso SPA ad eventi fornisce, ai sistemi informativi delle ASL, 
un web service definito dal seguente file WSDL:

----------------------------------
* WSDL SPARealTimeValidator.wsdl *
----------------------------------

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="urn:VALIDATOREDOC_SPARealTimeValidator" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="urn:VALIDATOREDOC_SPARealTimeValidator" xmlns:intf="urn:VALIDATOREDOC_SPARealTimeValidator" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

   <wsdl:message name="validateRequest">
      <wsdl:part name="request" type="xsd:string"/>
   </wsdl:message>

   <wsdl:message name="validateResult">
      <wsdl:part name="result" type="xsd:string"/>
   </wsdl:message>

   <wsdl:portType name="SPARealTimeValidatorImpl">

      <wsdl:operation name="validate" parameterOrder="request">
         <wsdl:input message="impl:validateRequest" name="validateRequest"/>
         <wsdl:output message="impl:validateResult" name="validateResult"/>
      </wsdl:operation>

   </wsdl:portType>

   <wsdl:binding name="it.eng.validatoredoc.spa.webservices.impl.SPARealTimeValidatorImpl" type="impl:SPARealTimeValidatorImpl">

      <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>

      <wsdl:operation name="validate">

         <wsdlsoap:operation soapAction=""/>

         <wsdl:input name="validateRequest">
            <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:VALIDATOREDOC_SPARealTimeValidator" use="encoded"/>
         </wsdl:input>

         <wsdl:output name="validateResult">
            <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:VALIDATOREDOC_SPARealTimeValidator" use="encoded"/>
         </wsdl:output>

      </wsdl:operation>

   </wsdl:binding>

   <wsdl:service name="SPARealTimeValidatorImplService">

      <wsdl:port binding="impl:it.eng.validatoredoc.spa.webservices.impl.SPARealTimeValidatorImpl" name="SPARealTimeValidator">
         <wsdlsoap:address location="http://localhost:7845/validatore-doc/services/SPARealTimeValidator"/>
      </wsdl:port>

   </wsdl:service>

</wsdl:definitions>

Il file wsdl, qui sopra riportato puo' essere scaricato direttamente dal NAL di riferimento.
Tale web service espone un metodo (validate) di validazione che accetta 
una stringa in input (il documento XML che deve contenere il record SPA da validare) e 
una stringa in uscita (il documento XML che deve contenere il record SPA validato, con i flag di errore valorizzati).

Da notare che la comunicazione avviene su protocollo sicuro (https), per questo  necessario un certificato elettronico rilasciato da Regione Toscana.


5. Bibliografia
===============
[1] Web Services Description Language (WSDL) 1.1 http://www.w3.org/TR/wsdl
[2] XML Schema http://www.w3.org/XML/Schema
[3] Latest SOAP versions http://www.w3.org/TR/soap/
[4] Apache Axis http://ws.apache.org/axis/